/**
 * 给你一个长度固定的整数数组 arr，请你将该数组中出现的每个零都复写一遍，并将其余的元素向右平移。

注意：请不要在超过该数组长度的位置写入元素。

要求：请对输入的数组 就地 进行上述修改，不要从函数返回任何东西。
 */
/**
 * @param {number[]} arr
 * @return {void} Do not return anything, modify arr in-place instead.
 */

// 用了Es6的一些语法，很简单。但可能不满足要求，这题主要还是考察双指针
// var duplicateZeros = function (arr) {
//   const n = arr.length
//   for (let i = 0; i < n; i++) {
//     if (arr[i] === 0) {
//       arr.splice(i, 0, 0)
//       arr.pop()
//       i++
//     }
//   }
// };


// 双指针
var duplicateZeros = function (arr) {
  let i = -1, top = 0;
  const n = arr.length;
  while (top < n) {
    i++;
    if (arr[i] === 0) {
      top += 2;
    } else {
      top++
    }
  }
  let j = n - 1
  // 当top !< n 时候 arr[i] === 0， top = n + 1, else top = n
  if (top === n + 1) {
    arr[j] = 0;
    j--;
    i--;
  }
  console.log(i);
  while (j > 0) {
    arr[j] = arr[i];
    j--;
    if (arr[i] === 0) {
      arr[j] = arr[i];
      j--;
    }
    i--;
  }
  // console.log(arr);
};

duplicateZeros([1, 0, 2, 3, 0, 4, 5, 0])